#include "Hexa8NodeIncomShpFunc.h"

using SG::DataStructure::Common::Real;
using SG::Algebra::Matrixd;
using SG::FEMSolver::Element::Hex8NodeIncomShpFunc;

//构造函数，初始化成员变量
Hex8NodeIncomShpFunc::Hex8NodeIncomShpFunc()
:DNDxiSet()
{}

/** @brief 计算积分点处非协调形函数的导数
 * 
 * 缓存各个积分点处的计算结果，避免下一次积分点循环时重复计算（内存换取计算时间）
 */

//Wilson附加形函数 h1=1-xi*xi  h2=1-eta*eta  h3=1-zeta*zeta
void Hex8NodeIncomShpFunc::Compute (const SG::DataStructure::FEM::IntegPointArray& integPoints)
{
    const auto nGauss = integPoints.size ();
    DNDxiSet.resize (nGauss);

    for (std::size_t index = 0; index < nGauss; ++index)
    {
        DNDxiSet[index] = Matrixd (3, 3);

        //第一列 h1对三个坐标的偏导
        DNDxiSet[index] (0, 0) = -2.0 * integPoints[index].m_x;
        DNDxiSet[index] (1, 0) = 0.0;
        DNDxiSet[index] (2, 0) = 0.0;

        //第二列 h2对三个坐标的偏导
        DNDxiSet[index] (0, 1) = 0.0;
        DNDxiSet[index] (1, 1) = -2.0 * integPoints[index].m_y;
        DNDxiSet[index] (2, 1) = 0.0;

        //第三列 h3对三个坐标的偏导
        DNDxiSet[index] (0, 2) = 0.0;
        DNDxiSet[index] (1, 2) = 0.0;
        DNDxiSet[index] (2, 2) = -2.0 * integPoints[index].m_z;
    }
}